package com.adil.base.collections.list;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: ArrayList 示例
 * @author: Adil
 * @date: 2024/4/24
 */
public class ArrayListDemo {
    public static void main(String[] args) {
        // ArrayList 是一个动态数组，它可以自动扩容，ArrayList 实现了 RandomAccess 接口，因此可以支持随机访问。
        // RandomAccess 接口是一个标记接口，表示该接口支持快速随机访问。
        // 对于 ArrayList，随机访问的时间复杂度为 O(1)，这意味着访问元素的时间复杂度为 O(1)。
        // 对于 LinkedList，随机访问的时间复杂度为 O(n)，这意味着访问元素的时间复杂度为 O(n)。
        // 备注：所以ArrayList 适合于随机访问，LinkedList 适合于顺序访问。且for循环速度快很多
        // ArrayList 是一个线程不安全的类，如果多个线程同时访问同一个 ArrayList，则可能导致数据不一致。
        // 为了解决这个问题，可以使用 Collections.synchronizedList() 方法来包装 ArrayList，使其变为线程安全的。
        // ArrayList 实现了 Cloneable 接口，因此支持 clone() 方法。
        // ArrayList 实现了 Serializable 接口，因此支持序列化。
        // ArrayList 继承了 AbstractList ，并实现了 List 接口。
        // ArrayList 扩容机制：
        // 当 ArrayList 的容量不足以容纳所有元素时，ArrayList 会自动扩容。扩容机制的原理是创建一个新的数组，容量为原数组的 2 倍，然后将原数组中的元素复制到新数组中。
        // 扩容机制的目的是避免频繁地创建和销毁数组，提高 ArrayList 的性能。
        // ArrayList 扩容机制的缺点是当 ArrayList 的容量超过一定阈值时，会导致性能下降。
        // 为了避免扩容带来的性能问题，可以设置初始容量，或者使用其他的集合类，如 LinkedList。
        // ArrayList 扩容是浅拷贝，即只拷贝元素本身，而不拷贝元素所属的集合。
        // ArrayList 扩容阈值：
        // 在 ArrayList 中，扩容阈值是 10，即当 ArrayList 的容量小于等于 10 时，ArrayList 不会扩容。
        // 扩容阈值是可以设置的，可以通过构造方法或者通过 setInitialCapacity() 方法设置。
        // 扩容阈值可以通过 JVM 参数 -Xmx 设置，如 -Xmx10m。

        // ArrayList 特点：
        // ArrayList 允许空元素。
        // ArrayList 允许重复元素。
        // ArrayList 允许 null 元素。
        // ArrayList 允许元素为 null。
        // ArrayList 允许元素为不同类型。
        // ArrayList 允许元素为基本类型。
        // ArrayList 允许元素为自定义类型。
        // ArrayList 允许元素为集合类型。
        // ArrayList 允许元素为数组类型。
        // ArrayList 允许元素为枚举类型。
        // ArrayList 允许元素为其他类型。
        // ArrayList 允许元素为任意类型。

        ArrayList<String> objectName =new ArrayList<>();// 初始化
//        E: 泛型数据类型，用于设置 objectName 的数据类型，只能为引用数据类型。
//        objectName: 对象名。
    }
}
